CONNESSIONE
di una scheda a Microcontrollore al P.C.
La comunicazione avviene con protocollo RS232 via USB.
Viene utilizzata, per l’interfacciamento Hardware tra PC e
scheda a Microcontrollore, la scheda FTDI232.
Scheda FTDI232. PinOUT
La scheda consente il collegamento via USB (solitamente
tipo Mini) di un segnale seriale RS232.
Il protocollo RS232 è tra i più datati ed utilizzati in
ogni ambito dell’elettronica.
Tale Protocollo di comunicazione è implementato su tutte le
schede a Microcontrollore.
Descrizione
della scheda FTDI232.
Come è visibile dalla illustrazione, (Fig.1) la scheda è
munita di due connettori uno USB che andrà connesso al PC e l’altro a 6 pin
passo 2,54mm per il collegamento alla scheda a MCU. I 9+9 pad disponibili sui
due lati della scheda, danno una completa possibilità di utilizzo in
particolari condizioni che non saranno trattate in questi appunti.
Il connettore
consente un comodo mezzo per collegarsi tramite Breadboard.
Un Jumper a due posizioni, consente di selezionare la tensione
di lavoro della scheda da collegare, 3.3v oppure 5v.
Due led si illuminano quando avviene un trasferimento
dati. Un led in trasmissione ed uno in
ricezione.
Specifiche
collegamenti relativi alla scheda prodotta dalla ‘Az-Delivery’
(Per ulteriori specifiche della scheda,
consultare il relativo Data sheet)
I collegamenti che utilizzeremo, sono solo quattro. Vcc,
GND, RX, TX. Tutti e quattro i pin sono disponibili sul connettore di uscita a
sei pin.
Per comunicare, PC e scheda a MCU hanno bisogno di
programmi che mettano in comunicazione i due circuiti.
Le schede programmabili hanno avuto negli ultimi anni una
diffusione massima grazie anche alla scheda Arduino che ha consentito anche ai
meno esperti del campo di portare a termine progetti di discipline molte volte
assolutamente lontane dalle conoscenze dell’elettronica programmabile.
Poter connettere il circuito programmabile ad un PC,
aumenta esponenzialmente le possibilità dei sistemi progettati.
Inutile elencare le numerosissime possibilità che si
aprono.
In questa ottica, per consentire all’ideatore dei progetti,
una più possibile semplice ma completa opportunità, si è pensato di
implementare la soluzione software relativa al PC con il notissimo e
relativamente semplice da usare linguaggio ‘Visual Basic’.
Per
questi appunti, utilizzeremo:
Lato
P.C. ---- Visual Basic Versione 2022
Lato
Scheda a Microcontrollore ---- linguaggio C.(Arduino
Uno)
Software di gestione su P.C.
Una Nota di Attenzione alla scelta del tipo di programma da
scegliere. La scelta del tipo di programma è essenziale per realizzare una
comunicazione RS232. Infatti le tipologie ‘Framework .NET’ comprendono tra gli
oggetti utilizzabili il componente ‘SerialPort’ che fa parte della .NET
componente(anche per VisualC #!)
Dopo aver installato la suite Visual Studio 2022,
1) Creiamo
un nuovo Progetto
2) Scegliamo
‘App Windows Forms (.Net Framework) (naturalmente Visual Basic!)
Attenzione a non confondersi
3) Diamo
un nome al nuovo Progetto’Comm_8Bytes_RS232’ ed accettiamo/prendiamo nota del
percorso dove verrà creato il Software.
Dopo qualche secondo
apparirà la schermata seguente.
Se non appaiono le finestre alla destra:
Visualizza:
--Esplora Soluzioni
--Proprietà
--output
--Elenco errori
Le finestre vanno tenute aperte da qualche parte. Io trovo
comodo averle alla mia destra!
Se non dovesse apparire la Form1(finestra principale su cui
metteremo i comandi vari di gestione) click su Comm_UnBytes_RS232 nella
finestra ‘Esplora soluzioni e quindi doppio click su Form1.
Bene!
Possiamo iniziare a scrivere il programma.
N.B.
Le spiegazioni/indicazioni sono per un utente che non conosce il Visual Basic.
Naturalmente
chi ha già una certa esperienza potrà saltare oppure leggere velocemente quanto
segue.
Come prima progetto, vogliamo realizzare una soluzione il
più semplice possibile.
Lo schema del sistema sarà quello di Fig.1
Il Sistema avrà una finestra di Input dove l’operatore
metterà un dato di un byte.
Alla pressione di un tasto il dato verrà comunicato alla scheda
MCU che, restituirà lo stesso dato incrementato di uno.
Prima di partire con la comunicazione, l’operatore dovrà
specificare in una casella il numero di COMM che il Sistema Operativo ha
attribuito per il collegamento con la nostra scheda. 😊
Il link seguente per vedere il video. …………………………….
Collochiamo, innanzi tutto, nella nostra Form1, tutti gli
oggetti necessari.
Da Casella degli strumenti:
Selezioniamo i seguenti Srumenti / oggetti.
Dopo averli posizionati nella Form1:
Con un Doppio Clik sulla Form1, si
aprirà il Listato del codice relativo al programma!
Notiamo che, in alto appare un nuovo TAB della
nuova finestra per il codice.
Ora possiamo passare dalla finestra Form1 a quella di
codice cliccando sui Tab.
(oppure, possiamo sempre aprire la finestra di codice con
doppio clik sulla Form.
Ma a cosa servono gli strumenti/oggetti che abbiamo
posizionato?
Ora lo scopriremo.
Iniziamo a scrivere un po' di codice……..
Clic sulla Label1 e ci appariranno a lato, nella finestra
delle proprietà, le proprietà dell’oggetto selezionato.
Nelle Proprietà della Label1, alla voce Text, possiamo
inserire la scritta che desideriamo appaia nella Label. Attualmente è riportato
Label1. Lo sostituiamo scrivendo:
Elenco
nomi di porti disponibili sul sistema
Infatti nella ComboBox1 sottostante, quando collegheremo il
nostro cavetto USB del sistema MCU, apparirà l’elenco delle porte
disponibili su nostro PC e dovremo selezionarne una prima di iniziare la
comunicazione. (esempio: COMM 3)
Nella Label1 apparirà la scritta appena inserita.
Ora passiamo al codice vero e proprio.
Con Un doppio clik sul Form1 ci troveremo nella finestra di
codice ed in particolare all’interno di una chiamata:
Public Class Form1
Private Sub Form1_Load(s……………….
ß-------------------Ci troviamo
Qui!!!!!!!!!!!!!!!!!!!!!!!!!!..................
End Sub
Siamo nel punto di partenza del programma. La prima cosa
che viene fatta all’avvio è infatti il codice relativo alla Form1.(quando verrà caricata…. Form1_Load(s……………….)
La prima cosa sarà implementare le righe di codice che ci
restituirà l’elenco dei nomi delle porte valide per il collegamento.
N.B. PortoComboBox è un normale ComboBox(quello
appena posizionato sulla Form1) che io ho chiamato PortoCompoBox.
Attenzione per cambiare il nome alla ComboBox, selezionarla
con un clik e nelle sue proprietà a lato cambiare il nome in PortoCompoBox.
Sarà necessario, Dichiarare la variabile portoMio per
contenere i porti liberi restituiti dal sistema. Tale dichiarazione va posizionata
appena sotto la scritta Public Class Form1 così sarà
visibile e valida per tutto il programma.
Public Class Form1
Dim portoMio As Array 'Matrice che
contiene i numeri dei Porti liberi
Bene! A questo punto
se voglio provare il programma, è possibile vederlo già parzialmente al lavoro.
Infatti sarà già in grado di visualizzare le porte USB
connesse al PC.
Per provare se funziona, avviar il programma e
connettere(dopo) un dispositivo USB al PC. Cliccando nella finestrella del
PortoComboBox si dovrà aprire la tendina e mostrare i dispositivi USB connessi.
(Vedi Fig.2)
Nel mio caso sono connessi due dispositivi. Quale sarà
Quello che mi interessa?
Da Start, Gestione dispositivi si può aprire la seguente
finestra (Fig.2)
dove possiamo vedere alla voce ‘Porte (COMM e LPT)’ i dispositivi indicati dal nostro programma.
Accanto ad ogni COMM indicata troveremo una breve descrizione che ci aiuterà a capire(almeno per esclusione) quale è la porta che dobbiamo
selezionare.
Normalmente,
per la scheda FTDI-USB, il Sistema Operativo non ripota alcuna ulteriore indicazione
poiché è semplicemente un adattatore di segnale.
Nel
nostro caso infatti la COMM da selezionare è
L a
COMM 3 è connessa ad un Programmatore STLink della STMicroelettronic(scheda
NUCLEO).
A
questo punto settiamo i parametri relativi alla comunicazione che verranno
gestiti dal Componente SerialPort.
A seguire, nella Private Sub Form1_Load(ByVal sender…. ,
scriviamo i seguenti parametri.
Riportiamo
l’intera Sub Form1:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
MyBase.Load
'---------------------------------------------------------------------------------------
'È
possibile ottenere un elenco di nomi di porta validi mediante il metodo
GetPortNames.
'N.B.PortoComboBox è un normale ComboBox che ho chiamato
PortoComboBox
PortoComboBox.DropDownStyle =
ComboBoxStyle.DropDownList 'combobox-stile-listato(ComboBox-rinominato
da ME in PortoComboBox)
portoMio = IO.Ports.SerialPort.GetPortNames() ' ---seleziona
porto seriale libero
PortoComboBox.Items.AddRange(portoMio) '
---seleziona porto seriale libero
'---------------------------------------------------------------------------------------
'setting
serial port------------------------------
SerialPort1.BaudRate =
9600 '—Baud
Rate = 9600 bit al secondo
SerialPort1.DataBits = 8 '---seleziona
n. bit per dato
SerialPort1.Parity = Parity.None ' nessuna
parità
SerialPort1.StopBits = StopBits.One 'Un bit di
stop
'SerialPort1.Parity
= IO.Ports.Parity.None (NON IMPLEMENTATO nel nostro caso)
'SerialPort1.StopBits
= IO.Ports.StopBits.One (NON IMPLEMENTATO nel nostro caso)
'-------------------------------------------------
'generico--------------------------------------
SerialPort1.DiscardNull = False ' (NON IMPLEMENTATO
nel nostro caso)
SerialPort1.DtrEnable = False ' (NON IMPLEMENTATO nel nostro caso)
SerialPort1.RtsEnable = False ' (NON IMPLEMENTATO nel nostro caso)
SerialPort1.Handshake = Handshake.None ' (NON
IMPLEMENTATO nel nostro caso)
SerialPort1.ParityReplace = 63 ' (NON necessario ma può tornare utile!)
'--------buffer----------------
SerialPort1.ReadBufferSize = 4096 ' (una dimensione accettabile
per il buffer di lettura)
SerialPort1.WriteBufferSize =
4096 ' (una dimensione
accettabile per il buffer di scrittura)
'----------timeout---------------
SerialPort1.ReadTimeout = -1 ' Timeout di lettura in millisecondi(-1=infinito—valore di
default)
SerialPort1.WriteTimeout = -1 ' Timeout di lettura in millisecondi(-1=infinito—valore di
default)
'-------------------------------------
SerialPort1.ReceivedBytesThreshold = 1 '
defacult
End
Sub
Possiamo notare, dopo l’avvio del
programma, che nella finestra del Codice è apparsa la scritta ‘Imports System.IO.Ports’ all’inizio
del Listato.
Per l’esecuzione del programma quindi è
necessario importare questa parte di codice e l’ide ha provveduto automaticamente!!!.
Imports System.IO.Ports
Public Class Form1
Dim portoMio As Array 'Matrice che contiene i numeri dei Porti liberi
Private Sub Form1_Load(se……………………………..
A questo punto, il programma ha tutte le informazioni per
realizzare laa comunicazione. Manca ora l’avvio e la gestione dei dati
inviati/ricevuti. Per questo scopo utilizzeremo il Bottone(Button1).
Facendo doppio clik sul Button1, automaticamente ci
troveremo nella finestra di codice già all’interno della sub che definirà le
operazioni da svolgere quando verrà premuto
il Button1. Tale Sub viene creata automaticamente.
Segue il codice dell’intera SubButton1_Click:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
Button1.Click
'assegna
il numero di COMM precedentemente selezionato in PortoComboBox
SerialPort1.PortName =
PortoComboBox.Text
'+++++++++++++++++++++++++++++ TX
++++++++++++++++++++++++++++++++++++++++++++++++++++
Dim
arr(4095) As Byte 'Dati da trasmettere
arr(0)
= Val(TextBox1.Text) 'scrive nella matrice alla
posizione di indice0 il dato nella TextBox1
SerialPort1.Open() ' apre
comunicazione
'------------------------
SerialPort1.Write(arr, 0, 1) 'scrive il dato
'++++++++++++++++++++++++++++ fine TX
++++++++++++++++++++++++++++++++++++++++++++++++++++++
'
appena finita la trasmissione alla scheda MCU inizia la ricezione del dato
Dalla scheda al PC. Il dato ricevuto sarà uguale a
quello
inviato incrementato di uno
'+++++++++++++++++++++++++++++ RX ++++++++++++++++++++++++++++++++++++++++++++
'Legge
un byte (PC=RX)
Dim
s(0 To 4095) As Byte 'Dati da ricevere
Dim
n = 0 ' n=
contatore dati
'
-------predisposto per la lettura di più dati!!!!------------------------
Do
s(n) = SerialPort1.ReadByte.ToString
' legge dato
n = n + 1
Loop
While n = 0 ' non looppa poiche acquisisce un solo dato
'++++++++++++++++++++++++++++ fine RX
++++++++++++++++++++++++++++++++++++++++++++++++++++++
'-----------------------------------
SerialPort1.Close() ' chiude comunicazione
'-------------------
TextBox2.Text = s(0) ' scrive il dato ricevuto nella TextBox2
End
Sub
Spiegazione
codice SubButton1_Click.
Possiamo distinguere quattro fasi:
1) SerialPort1.PortName
= PortoComboBox.Text
Assegna
all’oggetto SerialPort1
il COMM..libero precedentemente assegnato dal sistema all’avvio e
presente nella casella PortoComboBox.text.
2)
Trasmissione del dato
---Dimensiona
array arr(0 to 4095)
---n=0
contatore dati
---Apre
la comunicazione
---Scrive
l’unico dato da scrivere.
3)
Ricezione del dato
---Dimensiona
array s(0 to 4095)
---n=0
contatore dati
--- ciclo
lettura dati (nel nostro caso solo uno!)
---Legge il dato dalla matrice con pedice n
n=n+1
se n<>0 termina (fa solo un loop!)
4) Scrive il dato acquisito(che
verrà incrementato di uno dalla scheda MCU) nella TextBox2
Non dimentichiamo di dare una indicazione da mettere
nelle Label2 e Label3. Saranno le specifiche per le sottostanti TextBox.
Click sulla Label2, appariranno le Proprietà della
stessa. Alla voce Text inserire ‘Dato da mandare alla scheda MCU’
Click sulla Label3, appariranno le Proprietà della
stessa. Alla voce Text inserire ‘Dato ricevuto dalla scheda MCU[=dato
mandato+1]’
Come si presenta l’interfaccia grafica a fine
lavoro!!!